package com.whmall.service.crm.api;

import com.whmall.component.entity.dto.OperatorReqDTO;
import com.whmall.component.entity.dto.PageReqDTO;
import com.whmall.component.entity.dto.PageRspDTO;
import com.whmall.service.crm.entity.dto.companycertificatechemical.*;
import com.whmall.service.crm.module.companycertificatechemical.CompanyCertificateChemicalApproveQueryCriteria;

import java.util.List;

/**
 * 公司证照化合物关联API
 *
 * @author alex
 * @since 2020/8/17
 */
public interface CompanyCertificateChemicalApi {

    /**
     * 关联化合物
     *
     * @param operator                       操作人
     * @param companyId                      公司ID
     * @param certificateId                  证照ID
     * @param bindToUserId                   关联用户ID
     * @param associateRequests              关联化合物列表
     * @param associateChemicalDetectResults 关联化合物探测结果
     * @return 关联结果列表，其中顺序严格对应按照传入的参数顺序
     */
    List<AssociateChemicalResultRspDTO> associateChemicals(OperatorReqDTO operator, Long companyId, Long certificateId, Long bindToUserId,
                                                           List<AssociateChemicalReqDTO> associateRequests,
                                                           List<AssociateChemicalDetectResultReqDTO> associateChemicalDetectResults);

    /**
     * 移除关联的化合物
     *
     * @param operator      操作人
     * @param companyId     公司ID
     * @param certificateId 证照ID
     * @param associatedId  关联ID
     * @return
     */
    CompanyCertificateChemicalRspDTO removeChemical(OperatorReqDTO operator, Long companyId, Long certificateId, Long associatedId);

    /**
     * 删除所有证照化合物的审批列表。
     */
    void deleteAllApproveList();

    /**
     * 从已经关联的证照产品中重新生成审批列表。
     */
    void rebuildAllApproveFromAssociated();

    /**
     * 审批证照化合物
     *
     * @param requesterId   请求者ID（员工ID）
     * @param companyId     公司ID
     * @param certificateId 证照ID
     * @param request       审批请求
     * @return
     */
    List<CompanyCertificateChemicalRspDTO> approval(Long requesterId, Long companyId, Long certificateId, ApprovalCertificateChemicalReqDTO request);

    /**
     * 分页获取公司证照化合物列表
     *
     * @param pageRequest   分页请求
     * @param companyId     公司ID
     * @param certificateId 证照ID
     * @return 分页数据
     */
    PageRspDTO<CompanyCertificateChemicalPageItemRspDTO> page(PageReqDTO pageRequest, Long companyId, Long certificateId);

    /**
     * 分页获取公司证照化合物列表
     * @param pageRequest
     * @param queryReqDTO
     * @return
     */
    PageRspDTO<CompanyCertificateChemicalPageItemRspDTO> page(PageReqDTO pageRequest, CompanyCertificateChemicalQueryReqDTO queryReqDTO);

    /**
     * 根据条件分页获取公司证照化合物审批列表
     *
     * @param pageRequest 分页请求
     * @param criteria    查询条件
     * @return 分页数据
     */
    PageRspDTO<CompanyCertificateChemicalApprovePageItemRspDTO> pageForApprove(
            PageReqDTO pageRequest,
            CompanyCertificateChemicalApproveQueryCriteria criteria);

    /**
     * 统计数量
     * @param queryReqDTO
     * @return
     */
    int countBy(CompanyCertificateChemicalQueryReqDTO queryReqDTO);

    /**
     * 便于分组统计数量
     * @param queryReqDTO
     * @return
     */
    List<CompanyCertificateChemicalStatisticDTO> statisticBy(CompanyCertificateChemicalQueryReqDTO queryReqDTO);

    /**
     * 查询
     * @param queryReqDTO
     * @return
     */
    List<CompanyCertificateChemicalRspDTO> selectBy(CompanyCertificateChemicalQueryReqDTO queryReqDTO);

    /**
     * 直接关联证照
     *
     * @param option 信息
     * @return 操作结果
     * @since 202/7/27
     * */
    Integer certificate(CompanyCertificateChemicalOptionDTO option);

    /**
     * 批量关联、取消关联证照
     *
     * @param option 信息
     * @return 操作结果
     * @since 202/7/27
     * */
    String certificates(List<CompanyCertificateChemicalOptionDTO> options);


    /**
     * 根据主键id查询
     * @param ids
     * @return
     */
    List<CompanyCertificateChemicalPageItemRspDTO> selectByIds(List<Long> ids);

    /**
     * 根据证件id，化合物id，企业id来设置失效状态
     *
     * @param certificateId 证件id
     * @param chemicalIds   化合物id
     * @param companyId     企业id
     */
    void ineffectiveByChemicalAndCompanyId(long certificateId, List<Long> chemicalIds, long companyId);
}
